<?php

  /**
   * UserIdentity
   *
   * Класс аутентификации пользователя на сайте
   *
   * @property-read int $id идентификатор авторизованного пользователя
   */

  abstract class AUserIdentity extends CUserIdentity
  {
    const ERROR_ACCOUNT_INVALID = 10;

    /**
     * аутентификация пользователя
     *
     * @return bool
     * @access public
     */
    public function authenticate()
    {
      $this->errorCode = self::ERROR_NONE;
      /** @var $user User */
      $user = $this->findUser();
      if ($success = ($this->errorCode == self::ERROR_NONE))
        $this->setUser($user);
      return $success;
    }

    /**
     * найти пользователя
     *
     * @return User
     * @access protected
     */
    abstract protected function findUser();

    /**
     * вернуть идентификатор пользователя, сохраненный в сессии
     *
     * @return int
     * @access public
     */
    public function getId()
    {
      return $this->getState("id");
    }

    /**
     * сохранить атрибуты пользователя в сессии
     *
     * @param User $user экземпляр класса записи пользователя в БД
     * @return void
     * @access public
     */
    public function setUser(User $user)
    {
      $this->setState("id"  , $user->id  );
      $this->setState("role", $user->role);

    // удаление, либо фиксация временных постов
      $role = mb_strtolower($user->role);
      if (in_array($role, array(User::USER, User::AUTOR)))
      {
        $tmp = Post::getTemporary($user->id);
        if (!empty($tmp))
        {
          Record::$db->createCommand("update `posts` set `is_temporary`=null where `id` in('".join("','", $tmp)."')")->execute();
          if ($role == User::USER)
            foreach (Post::model()->findAllByPk($tmp) as $post)
              $post->delete();
        }
      }
    }
  }

?>
